有一個第三方的程式,它會連線新系統的Oracle DB,但是每一段時間都會斷線,此時會出現了一個訊息:ora-01012: not logged on
登入DB後查看log,發現有下列的訊息,應該就是原因了:
KILL SESSION for sid=(124, 55212):
Reason = profile limit idle_time
很明顯有一個session受到profile的限制而被kill掉。
連到db並查詢是否有啟用資源限制:
SQL> show parameter resource_limit;
NAME TYPE VALUE
-------------- -------- -------
resource_limit boolean true
第三方程式是用TEST001來連線DB,所以在DB上查詢USER TEST001的profile:
SQL> select profile from dba_users where username = 'TEST001';
PROFILE
--------
A_PROFILE
查詢A_PROFIEL這個profile的時間限制:
SQL> select PROFILE,RESOURCE_NAME,LIMIT from dba_profiles where profile='A_PROFILE' and resource_name in ('IDLE_TIME','CONNECT_TIME');
PROFILE RESOURCE_NAME LIMIT
----------- --------------- -------
A_PROFILE IDLE_TIME 30
A_PROFILE CONNECT_TIME DEFAULT
把限制改長一點:
SQL> ALTER PROFILE A_PROFILE LIMIT IDLE_TIME 60;
或是把限制取消:
SQL> ALTER PROFILE A_PROFIEL LIMIT IDLE_TIME UNLIMITED;
最後我們是選擇把時間限制取消,這樣問題也解決了
某種程上那算是DB的保護措施。凡是咬住的連線就會吃部份的DB記憶體。假設有太多這種程式而不去清。DB的效能是會被影響的。所以才會有 idel 太久 kill 的功能。修改idel 時間或時間限制取消並不是一個好的解決方式。